gdkwindow: different displays, different classes
authorOlivier Fourdan <ofourdan@redhat.com>
Tue, 28 Mar 2017 09:10:05 +0000 (11:10 +0200)
committerOlivier Fourdan <ofourdan@redhat.com>
Mon, 3 Apr 2017 17:16:10 +0000 (19:16 +0200)
GdkWindow's before_process_all_updates() and after_process_all_updates()
wrongly assume that all displays are from the same class, which is not
the case if for example a client open different displays with different
backends such as X11 and Wayland.

Use the actual class for each display in the display list to avoid a
crash when mixing displays from different classes.

Fix suggested by Christian Persch <chpe@gnome.org> in bug #776472.

https://bugzilla.gnome.org/show_bug.cgi?id=776472

gdk/gdkwindow.c

index ac3229f53ca2acf7e753761453261122f0e61e34..689d666100b20bcc49af8b0da8fc7ff5fe21c21d 100644 (file)
@@ -4024,12 +4024,10 @@ static void
 before_process_all_updates (void)
 {
   GSList *displays, *l;
-  GdkDisplayClass *display_class;
 
   displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
-  display_class = GDK_DISPLAY_GET_CLASS (displays->data);
   for (l = displays; l; l = l->next)
-    display_class->before_process_all_updates (l->data);
+    GDK_DISPLAY_GET_CLASS (l->data)->before_process_all_updates (l->data);
 
   g_slist_free (displays);
 }
@@ -4038,12 +4036,10 @@ static void
 after_process_all_updates (void)
 {
   GSList *displays, *l;
-  GdkDisplayClass *display_class;
 
   displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
-  display_class = GDK_DISPLAY_GET_CLASS (displays->data);
   for (l = displays; l; l = l->next)
-    display_class->after_process_all_updates (l->data);
+    GDK_DISPLAY_GET_CLASS (l->data)->after_process_all_updates (l->data);
 
   g_slist_free (displays);
 }